package net.conselldemallorca.helium.integracio.plugins.persones;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import net.conselldemallorca.helium.core.util.GlobalProperties;
import net.conselldemallorca.helium.integracio.plugins.persones.DadesPersona.Sexe;
/**
* Implementació de la interficie PersonesPlugin amb accés per JDBC.
*
* @author Limit Tecnologies <limit@limit.es>
*/
public class PersonesPluginJdbc implements PersonesPlugin {
private NamedParameterJdbcTemplate namedJdbcTemplate;
public DadesPersona findAmbCodi(String codi) throws PersonesPluginException {
try {
String query = GlobalProperties.getInstance().getProperty("app.persones.plugin.jdbc.filter.code");
Map<String, Object> parametres = new HashMap<String, Object>();
parametres.put("codi", codi);
List<DadesPersona> resultat = consultaSql(query, parametres);
if (resultat.size() > 0)
return resultat.get(0);
return null;
} catch (Exception ex) {
throw new PersonesPluginException("No s'ha pogut trobar la persona", ex);
}
}
public List<DadesPersona> findLikeNomSencer(String text) throws PersonesPluginException {
try {
String query = GlobalProperties.getInstance().getProperty("app.persones.plugin.jdbc.filter.name");
Map<String, Object> parametres = new HashMap<String, Object>();
parametres.put("nom", text);
List<DadesPersona> resultat = consultaSql(query, parametres);
if (resultat.size() > 0)
return resultat;
return null;
} catch (Exception ex) {
throw new PersonesPluginException("No s'ha pogut trobar cap persona", ex);
}
}
public List<DadesPersona> findAll() throws PersonesPluginException {
try {
String query = GlobalProperties.getInstance().getProperty("app.persones.plugin.jdbc.filter.name");
Map<String, Object> parametres = new HashMap<String, Object>();
parametres.put("nom", "");
List<DadesPersona> resultat = consultaSql(query, parametres);
if (resultat.size() > 0)
return resultat;
return null;
} catch (Exception ex) {
throw new PersonesPluginException("No s'ha pogut trobar cap persona", ex);
}
}
@SuppressWarnings("unchecked")
public List<String> findRolsAmbCodi(String codi) throws PersonesPluginException {
List<String> rols = new ArrayList<String>();
try {
String query = GlobalProperties.getInstance().getProperty("app.persones.plugin.jdbc.filter.roles");
if (query != null && !query.isEmpty()) {
Map<String, Object> parametres = new HashMap<String, Object>();
parametres.put("codi", codi);
String jndi = GlobalProperties.getInstance().getProperty("app.persones.plugin.jdbc.jndi.parameter");
Context initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup(jndi);
namedJdbcTemplate = new NamedParameterJdbcTemplate(ds);
MapSqlParameterSource parameterSource = new MapSqlParameterSource(parametres) {
public boolean hasValue(String paramName) {
return true;
}
};
rols = namedJdbcTemplate.query(
query,
parameterSource,
new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
return rs.getString(1);
}
});
}
} catch (Exception ex) {
throw new PersonesPluginException("No s'ha pogut trobar la persona", ex);
}
return rols;
}
@SuppressWarnings("unchecked")
private List<DadesPersona> consultaSql(
String query,
Map<String, Object> parametres) throws Exception {
String jndi = GlobalProperties.getInstance().getProperty("app.persones.plugin.jdbc.jndi.parameter");
Context initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup(jndi);
namedJdbcTemplate = new NamedParameterJdbcTemplate(ds);
MapSqlParameterSource parameterSource = new MapSqlParameterSource(parametres) {
public boolean hasValue(String paramName) {
return true;
}
};
List<DadesPersona> resultat = namedJdbcTemplate.query(
query,
parameterSource,
new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
if (nomLlinatgesSeparat()) {
String codi = rs.getString(1);
String nom = rs.getString(2);
String llinatges = rs.getString(3);
String dni = rs.getString(4);
String email = rs.getString(5);
DadesPersona persona = new DadesPersona(codi,
nom,
llinatges,
email,
sexePerNom(nom));
persona.setDni(dni);
return persona;
} else {
String codi = rs.getString(1);
String nomSencer = rs.getString(2);
String dni = rs.getString(3);
String email = rs.getString(4);
DadesPersona persona = new DadesPersona(codi,
nomSencer,
email,
sexePerNom(nomSencer));
persona.setDni(dni);
return persona;
}
}
});
return resultat;
}
private Sexe sexePerNom(String nom) {
String[] parts = nom.trim().split(" ");
String norm = parts[0];
norm = norm.replaceAll("[àâ]","a");
norm = norm.replaceAll("[èéêë]","e");
norm = norm.replaceAll("[ïî]","i");
norm = norm.replaceAll("Ô","o");
norm = norm.replaceAll("[ûù]","u");
norm = norm.replaceAll("[ÀÂ]","A");
norm = norm.replaceAll("[ÈÉÊË]","E");
norm = norm.replaceAll("[ÏÎ]","I");
norm = norm.replaceAll("Ô","O");
norm = norm.replaceAll("[ÛÙ]","U");
if (norm.toLowerCase().endsWith("a")) {
return Sexe.SEXE_DONA;
} else {
return Sexe.SEXE_HOME;
}
}
private boolean nomLlinatgesSeparat() {
String junt = GlobalProperties.getInstance().getProperty("app.persones.plugin.jdbc.nom.llinatges.junt");
if (junt == null)
junt = GlobalProperties.getInstance().getProperty("app.persones.plugin.jdbc.nom.llimatges.junt");
if (junt == null)
return true;
return junt.equalsIgnoreCase("false");
}
}